This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

library(plotly)
library(ggplot2)
library(dplyr)
library(magrittr)
movie <- read.csv("C:/Users/broadwmc/Desktop/movie.csv") 
summary(movie)
]
table(movie$clean_test)
str(movie)
'data.frame':   1794 obs. of  15 variables:
 $ year          : int  2013 2012 2013 2013 2013 2013 2013 2013 2013 2013 ...
 $ imdb          : Factor w/ 1794 levels "tt00293564","tt0035423",..: 1707 1551 1769 1510 1099 1546 1667 1781 1732 1733 ...
 $ title         : Factor w/ 1768 levels "(500) Days of Summer",..: 15 396 4 11 25 26 41 55 63 66 ...
 $ test          : Factor w/ 10 levels "dubious","dubious-disagree",..: 5 10 6 5 3 3 5 10 9 5 ...
 $ clean_test    : Factor w/ 5 levels "dubious","men",..: 3 5 3 3 2 2 3 5 5 3 ...
 $ binary        : Factor w/ 2 levels "FAIL","PASS": 1 2 1 1 1 1 1 2 2 1 ...
 $ budget        : int  13000000 45000000 20000000 61000000 40000000 225000000 92000000 12000000 13000000 130000000 ...
 $ domgross      : Factor w/ 1751 levels "#N/A","0","100012499",..: 733 257 1296 1574 1729 1050 1485 347 471 1404 ...
 $ intgross      : Factor w/ 1757 levels "#N/A","100179814",..: 1102 1078 338 223 1711 285 846 1655 442 670 ...
 $ code          : Factor w/ 85 levels "1970PASS","1971FAIL",..: 84 83 84 84 84 84 84 85 85 84 ...
 $ budget_2013.  : int  13000000 45658735 20000000 61000000 40000000 225000000 92000000 12000000 13000000 130000000 ...
 $ domgross_2013.: Factor w/ 1776 levels "#N/A","100004670",..: 712 217 1261 1545 1739 1014 1470 321 435 1376 ...
 $ intgross_2013.: Factor w/ 1783 levels "#N/A","1004550114",..: 1078 1062 343 216 1738 279 837 1669 430 664 ...
 $ period.code   : int  1 1 1 1 1 1 1 1 1 1 ...
 $ decade.code   : int  1 1 1 1 1 1 1 1 1 1 ...
# Data transforming  
movie$domgross <- as.integer(movie$domgross)
movie$intgross <- as.integer(movie$intgross)
movie$domgross_2013. <- as.integer(movie$domgross_2013.)
movie$intgross_2013. <- as.integer(movie$intgross_2013.)
# Simple dplyr piping %>% example 
movie %>%
  select(year, title, code) %>%
  group_by(year)
# What percentage of all film passes and fails the Bechdel test? 
## 44% = PASS = 803/1794 = 44.60% and 56% = FAIL = 991/1794 = 55.24% 
table(movie %>%
  select(clean_test, binary) %>%
  group_by(binary) %>%
    count()) 
      n
binary 803 991
  FAIL   0   1
  PASS   1   0
# What percentage of film in past decade passes and fails the Bechdel test?
## PASS = 577/1215 = 47% and FAIL = 638/1215 = 53% 
table(movie %>%
        select(year, clean_test, binary) %>%
        filter(year > "2000") %>%
        group_by(binary) %>%
        count())
      n
binary 577 638
  FAIL   0   1
  PASS   1   0
# Simple histogram showing number of films that fail and pass Bechdel test, color categorized by categorical variable 'test' 
plot_ly(movie, x = ~binary, color = ~clean_test) %>%
  add_histogram() 
# Histograms faceted by 'test' 
one_plot <- function(d) {
  plot_ly(d, x = ~budget) %>%
    add_annotations(
      ~unique(clean_test), x = 0.5, y = 1, 
      xref = "paper", yref = "paper", showarrow = FALSE
    )
}
movie %>%
  split(.$clean_test) %>%
  lapply(one_plot) %>% 
  subplot(nrows = 3, shareX = TRUE) %>%
  hide_legend()
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#histogram
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#histogram
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#histogram
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#histogram
No trace type specified:
  Based on info supplied, a 'histogram' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#histogram
# Scatterplot of budget by domestic gross 
## Introducing text attribute 
plot_ly(movie, x = ~budget_2013., y = ~domgross , type="scatter", mode = "markers", text = ~paste("Title: ", title, '<br>Year:', year), marker=list(size=5 , opacity=0.5), color = ~clean_test)
# 3D scatterplot of budget by domestic gross by international gross 
plot_ly(movie, x = ~budget_2013., y = ~domgross, z = ~intgross, type = "scatter3d", 
        mode = "markers", text = ~paste("Title: ", title, '<br>Year:', year), 
        marker=list(size=5 , opacity=0.5), color = ~clean_test)
# Donut chart of movies (2008-2013) that pass and fail the Bechdel Test
movie %>%
  group_by(code) %>%
  filter(year > "2007") %>%
  summarise(count = n()) %>%
  plot_ly(labels = ~code, values = ~count) %>%
  add_pie(hole = 0.6) %>%
  layout(title = "2008-2013 Film Bechdel Test Pass/Fail",  showlegend = F,
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
# Boxplot of Bechdel pass/fail (2009-2013) by budget 
## Factor by code year 
## +Select: cleantest and binary. Change: plot_ly(x = ~movie$binary, y = ~movie$budget_2013., color = ~movie$clean_test, type = "box") %>% layout(boxmode = "group")
movie$code <- factor(movie$code,levels = c("2008PASS", "2008FAIL", "2009PASS", "2009FAIL", "2010PASS", "2010FAIL", "2011PASS", "2011FAIL", "2012PASS", "2012FAIL", "2013PASS", "2013FAIL"))
movie %>%
  filter(year > "2008") %>%
  plot_ly(y = ~budget_2013., color = ~code, type = "box", colors = "Set3") 

# Line graph of pass/fail budgets 
movie %>% 
  plot_ly(x = ~year, y = ~budget_2013.) %>% 
  add_lines(color = ~binary) %>%
  layout(
    xaxis = list(title = "year"),
    yaxis = list(title = "budget")
  ) 
minimal value for n is 3, returning requested palette with 3 different levels
minimal value for n is 3, returning requested palette with 3 different levels
# Line graph of clean_test 
movie %>%
  group_by(clean_test) %>%
  transform(id = as.integer(factor(clean_test))) %>%
  plot_ly(x = ~year, y = ~budget_2013., color = ~clean_test, colors = "Dark2", text = ~paste("Title: ", title, '<br>Year:', year)) %>%
  add_lines() %>%
  layout(yaxis=list(title="budget"))
# Hadley Wickham's animated bubble chart using gapminder dataset 
data(gapminder, package = "gapminder")
gg <- ggplot(gapminder, aes(gdpPercap, lifeExp, color = continent)) +
  geom_point(aes(size = pop, frame = year, ids = country)) +
  scale_x_log10()
Ignoring unknown aesthetics: frame, ids
ggplotly(gg)
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
# More complex dylr. Use either top_n function or filter(budget_2013. == max(budget_2013.)) 
topfive <- movie %>%
  select(title, year, binary, clean_test, budget_2013.) %>%
  group_by(year) %>%
  top_n(n=5) %>%
  filter(year > "2000") %>%
  as.data.frame()
Selecting by budget_2013.
# Creating a dataframe for the 'bottom five' (least budget) 
btmfive <- movie %>%
  select(title, year, binary, clean_test, budget_2013.) %>%
  group_by(year) %>%
  top_n(n=-5) %>%
  filter(year > "2000") %>%
  as.data.frame()
Selecting by budget_2013.
# As seen in Wicham's gapminder example, plotly can be used to transform existing ggplot2 visualization into plotly visualizations
top <- topfive %>%
  ggplot(mapping = aes(x = binary, fill=clean_test, text = paste("title:", title))) +
  geom_bar() +
  facet_grid(. ~ year) + 
  theme(axis.text.x = element_text(angle = 45)) +
  scale_fill_brewer(palette="OrRd") 
ggplotly(top)
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
# Apply ggplotly to 'bottom five' films   
bottom <- btmfive %>%
  ggplot(mapping = aes(x = binary, fill=clean_test, text = paste("title:", title))) +
  geom_bar() +
  facet_grid(. ~ year) + 
  theme(axis.text.x = element_text(angle = 45)) +
  scale_fill_brewer(palette="BuGn") 
ggplotly(bottom)
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIlIgUGxvdGx5IFZpc3VhbGl6YXRpb24iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KYGBgDQoNCmBgYHtyfQ0KbW92aWUgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2Jyb2Fkd21jL0Rlc2t0b3AvbW92aWUuY3N2IikgDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KG1vdmllKQ0KXQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUobW92aWUkY2xlYW5fdGVzdCkNCmBgYA0KDQpgYGB7cn0NCnN0cihtb3ZpZSkNCmBgYA0KDQpgYGB7cn0NCiMgRGF0YSB0cmFuc2Zvcm1pbmcgIA0KbW92aWUkZG9tZ3Jvc3MgPC0gYXMuaW50ZWdlcihtb3ZpZSRkb21ncm9zcykNCm1vdmllJGludGdyb3NzIDwtIGFzLmludGVnZXIobW92aWUkaW50Z3Jvc3MpDQptb3ZpZSRkb21ncm9zc18yMDEzLiA8LSBhcy5pbnRlZ2VyKG1vdmllJGRvbWdyb3NzXzIwMTMuKQ0KbW92aWUkaW50Z3Jvc3NfMjAxMy4gPC0gYXMuaW50ZWdlcihtb3ZpZSRpbnRncm9zc18yMDEzLikNCmBgYA0KDQpgYGB7cn0NCiMgU2ltcGxlIGRwbHlyIHBpcGluZyAlPiUgZXhhbXBsZSANCm1vdmllICU+JQ0KICBzZWxlY3QoeWVhciwgdGl0bGUsIGNvZGUpICU+JQ0KICBncm91cF9ieSh5ZWFyKQ0KYGBgDQoNCmBgYHtyfQ0KDQojIFdoYXQgcGVyY2VudGFnZSBvZiBhbGwgZmlsbSBwYXNzZXMgYW5kIGZhaWxzIHRoZSBCZWNoZGVsIHRlc3Q/IA0KIyMgNDQlID0gUEFTUyA9IDgwMy8xNzk0ID0gNDQuNjAlIGFuZCA1NiUgPSBGQUlMID0gOTkxLzE3OTQgPSA1NS4yNCUgDQp0YWJsZShtb3ZpZSAlPiUNCiAgc2VsZWN0KGNsZWFuX3Rlc3QsIGJpbmFyeSkgJT4lDQogIGdyb3VwX2J5KGJpbmFyeSkgJT4lDQogICAgY291bnQoKSkgDQpgYGANCg0KYGBge3J9DQojIFdoYXQgcGVyY2VudGFnZSBvZiBmaWxtIGluIHBhc3QgZGVjYWRlIHBhc3NlcyBhbmQgZmFpbHMgdGhlIEJlY2hkZWwgdGVzdD8NCiMjIFBBU1MgPSA1NzcvMTIxNSA9IDQ3JSBhbmQgRkFJTCA9IDYzOC8xMjE1ID0gNTMlIA0KdGFibGUobW92aWUgJT4lDQogICAgICAgIHNlbGVjdCh5ZWFyLCBjbGVhbl90ZXN0LCBiaW5hcnkpICU+JQ0KICAgICAgICBmaWx0ZXIoeWVhciA+ICIyMDAwIikgJT4lDQogICAgICAgIGdyb3VwX2J5KGJpbmFyeSkgJT4lDQogICAgICAgIGNvdW50KCkpDQpgYGANCg0KYGBge3J9DQojIFNpbXBsZSBoaXN0b2dyYW0gc2hvd2luZyBudW1iZXIgb2YgZmlsbXMgdGhhdCBmYWlsIGFuZCBwYXNzIEJlY2hkZWwgdGVzdCwgY29sb3IgY2F0ZWdvcml6ZWQgYnkgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ3Rlc3QnIA0KcGxvdF9seShtb3ZpZSwgeCA9IH5iaW5hcnksIGNvbG9yID0gfmNsZWFuX3Rlc3QpICU+JQ0KICBhZGRfaGlzdG9ncmFtKCkgDQoNCmBgYA0KDQpgYGB7cn0NCg0KIyBIaXN0b2dyYW1zIGZhY2V0ZWQgYnkgJ3Rlc3QnIA0Kb25lX3Bsb3QgPC0gZnVuY3Rpb24oZCkgew0KICBwbG90X2x5KGQsIHggPSB+YnVkZ2V0KSAlPiUNCiAgICBhZGRfYW5ub3RhdGlvbnMoDQogICAgICB+dW5pcXVlKGNsZWFuX3Rlc3QpLCB4ID0gMC41LCB5ID0gMSwgDQogICAgICB4cmVmID0gInBhcGVyIiwgeXJlZiA9ICJwYXBlciIsIHNob3dhcnJvdyA9IEZBTFNFDQogICAgKQ0KfQ0KDQptb3ZpZSAlPiUNCiAgc3BsaXQoLiRjbGVhbl90ZXN0KSAlPiUNCiAgbGFwcGx5KG9uZV9wbG90KSAlPiUgDQogIHN1YnBsb3QobnJvd3MgPSAzLCBzaGFyZVggPSBUUlVFKSAlPiUNCiAgaGlkZV9sZWdlbmQoKQ0KYGBgDQoNCmBgYHtyfQ0KIyBTY2F0dGVycGxvdCBvZiBidWRnZXQgYnkgZG9tZXN0aWMgZ3Jvc3MgDQojIyBJbnRyb2R1Y2luZyB0ZXh0IGF0dHJpYnV0ZSANCnBsb3RfbHkobW92aWUsIHggPSB+YnVkZ2V0XzIwMTMuLCB5ID0gfmRvbWdyb3NzICwgdHlwZT0ic2NhdHRlciIsIG1vZGUgPSAibWFya2VycyIsIHRleHQgPSB+cGFzdGUoIlRpdGxlOiAiLCB0aXRsZSwgJzxicj5ZZWFyOicsIHllYXIpLCBtYXJrZXI9bGlzdChzaXplPTUgLCBvcGFjaXR5PTAuNSksIGNvbG9yID0gfmNsZWFuX3Rlc3QpDQoNCmBgYA0KDQpgYGB7cn0NCiMgM0Qgc2NhdHRlcnBsb3Qgb2YgYnVkZ2V0IGJ5IGRvbWVzdGljIGdyb3NzIGJ5IGludGVybmF0aW9uYWwgZ3Jvc3MgDQpwbG90X2x5KG1vdmllLCB4ID0gfmJ1ZGdldF8yMDEzLiwgeSA9IH5kb21ncm9zcywgeiA9IH5pbnRncm9zcywgdHlwZSA9ICJzY2F0dGVyM2QiLCANCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwgdGV4dCA9IH5wYXN0ZSgiVGl0bGU6ICIsIHRpdGxlLCAnPGJyPlllYXI6JywgeWVhciksIA0KICAgICAgICBtYXJrZXI9bGlzdChzaXplPTUgLCBvcGFjaXR5PTAuNSksIGNvbG9yID0gfmNsZWFuX3Rlc3QpDQpgYGANCg0KYGBge3J9DQojIERvbnV0IGNoYXJ0IG9mIG1vdmllcyAoMjAwOC0yMDEzKSB0aGF0IHBhc3MgYW5kIGZhaWwgdGhlIEJlY2hkZWwgVGVzdA0KbW92aWUgJT4lDQogIGdyb3VwX2J5KGNvZGUpICU+JQ0KICBmaWx0ZXIoeWVhciA+ICIyMDA3IikgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lDQogIHBsb3RfbHkobGFiZWxzID0gfmNvZGUsIHZhbHVlcyA9IH5jb3VudCkgJT4lDQogIGFkZF9waWUoaG9sZSA9IDAuNikgJT4lDQogIGxheW91dCh0aXRsZSA9ICIyMDA4LTIwMTMgRmlsbSBCZWNoZGVsIFRlc3QgUGFzcy9GYWlsIiwgIHNob3dsZWdlbmQgPSBGLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHNob3dncmlkID0gRkFMU0UsIHplcm9saW5lID0gRkFMU0UsIHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHNob3dncmlkID0gRkFMU0UsIHplcm9saW5lID0gRkFMU0UsIHNob3d0aWNrbGFiZWxzID0gRkFMU0UpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBCb3hwbG90IG9mIEJlY2hkZWwgcGFzcy9mYWlsICgyMDA5LTIwMTMpIGJ5IGJ1ZGdldCANCiMjIEZhY3RvciBieSBjb2RlIHllYXIgDQojIyArU2VsZWN0OiBjbGVhbnRlc3QgYW5kIGJpbmFyeS4gQ2hhbmdlOiBwbG90X2x5KHggPSB+bW92aWUkYmluYXJ5LCB5ID0gfm1vdmllJGJ1ZGdldF8yMDEzLiwgY29sb3IgPSB+bW92aWUkY2xlYW5fdGVzdCwgdHlwZSA9ICJib3giKSAlPiUgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiKQ0KDQptb3ZpZSRjb2RlIDwtIGZhY3Rvcihtb3ZpZSRjb2RlLGxldmVscyA9IGMoIjIwMDhQQVNTIiwgIjIwMDhGQUlMIiwgIjIwMDlQQVNTIiwgIjIwMDlGQUlMIiwgIjIwMTBQQVNTIiwgIjIwMTBGQUlMIiwgIjIwMTFQQVNTIiwgIjIwMTFGQUlMIiwgIjIwMTJQQVNTIiwgIjIwMTJGQUlMIiwgIjIwMTNQQVNTIiwgIjIwMTNGQUlMIikpDQoNCm1vdmllICU+JQ0KICBmaWx0ZXIoeWVhciA+ICIyMDA4IikgJT4lDQogIHBsb3RfbHkoeSA9IH5idWRnZXRfMjAxMy4sIGNvbG9yID0gfmNvZGUsIHR5cGUgPSAiYm94IiwgY29sb3JzID0gIlNldDMiKSANCg0KIyBMaW5lIGdyYXBoIG9mIHBhc3MvZmFpbCBidWRnZXRzIA0KbW92aWUgJT4lIA0KICBwbG90X2x5KHggPSB+eWVhciwgeSA9IH5idWRnZXRfMjAxMy4pICU+JSANCiAgYWRkX2xpbmVzKGNvbG9yID0gfmJpbmFyeSkgJT4lDQogIGxheW91dCgNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAieWVhciIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJidWRnZXQiKQ0KICApIA0KYGBgDQoNCmBgYHtyfQ0KIyBMaW5lIGdyYXBoIG9mIGNsZWFuX3Rlc3QgDQptb3ZpZSAlPiUNCiAgZ3JvdXBfYnkoY2xlYW5fdGVzdCkgJT4lDQogIHRyYW5zZm9ybShpZCA9IGFzLmludGVnZXIoZmFjdG9yKGNsZWFuX3Rlc3QpKSkgJT4lDQogIHBsb3RfbHkoeCA9IH55ZWFyLCB5ID0gfmJ1ZGdldF8yMDEzLiwgY29sb3IgPSB+Y2xlYW5fdGVzdCwgY29sb3JzID0gIkRhcmsyIiwgdGV4dCA9IH5wYXN0ZSgiVGl0bGU6ICIsIHRpdGxlLCAnPGJyPlllYXI6JywgeWVhcikpICU+JQ0KICBhZGRfbGluZXMoKSAlPiUNCiAgbGF5b3V0KHlheGlzPWxpc3QodGl0bGU9ImJ1ZGdldCIpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBIYWRsZXkgV2lja2hhbSdzIGFuaW1hdGVkIGJ1YmJsZSBjaGFydCB1c2luZyBnYXBtaW5kZXIgZGF0YXNldCANCmRhdGEoZ2FwbWluZGVyLCBwYWNrYWdlID0gImdhcG1pbmRlciIpDQpnZyA8LSBnZ3Bsb3QoZ2FwbWluZGVyLCBhZXMoZ2RwUGVyY2FwLCBsaWZlRXhwLCBjb2xvciA9IGNvbnRpbmVudCkpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHBvcCwgZnJhbWUgPSB5ZWFyLCBpZHMgPSBjb3VudHJ5KSkgKw0KICBzY2FsZV94X2xvZzEwKCkNCmdncGxvdGx5KGdnKQ0KYGBgDQoNCmBgYHtyfQ0KIyBNb3JlIGNvbXBsZXggZHlsci4gVXNlIGVpdGhlciB0b3BfbiBmdW5jdGlvbiBvciBmaWx0ZXIoYnVkZ2V0XzIwMTMuID09IG1heChidWRnZXRfMjAxMy4pKSANCnRvcGZpdmUgPC0gbW92aWUgJT4lDQogIHNlbGVjdCh0aXRsZSwgeWVhciwgYmluYXJ5LCBjbGVhbl90ZXN0LCBidWRnZXRfMjAxMy4pICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgdG9wX24obj01KSAlPiUNCiAgZmlsdGVyKHllYXIgPiAiMjAwMCIpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCmBgYA0KDQpgYGB7cn0NCiMgQ3JlYXRpbmcgYSBkYXRhZnJhbWUgZm9yIHRoZSAnYm90dG9tIGZpdmUnIChsZWFzdCBidWRnZXQpIA0KYnRtZml2ZSA8LSBtb3ZpZSAlPiUNCiAgc2VsZWN0KHRpdGxlLCB5ZWFyLCBiaW5hcnksIGNsZWFuX3Rlc3QsIGJ1ZGdldF8yMDEzLikgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICB0b3BfbihuPS01KSAlPiUNCiAgZmlsdGVyKHllYXIgPiAiMjAwMCIpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCg0KYGBgDQoNCmBgYHtyfQ0KIyBBcyBzZWVuIGluIFdpY2hhbSdzIGdhcG1pbmRlciBleGFtcGxlLCBwbG90bHkgY2FuIGJlIHVzZWQgdG8gdHJhbnNmb3JtIGV4aXN0aW5nIGdncGxvdDIgdmlzdWFsaXphdGlvbiBpbnRvIHBsb3RseSB2aXN1YWxpemF0aW9ucw0KdG9wIDwtIHRvcGZpdmUgJT4lDQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBiaW5hcnksIGZpbGw9Y2xlYW5fdGVzdCwgdGV4dCA9IHBhc3RlKCJ0aXRsZToiLCB0aXRsZSkpKSArDQogIGdlb21fYmFyKCkgKw0KICBmYWNldF9ncmlkKC4gfiB5ZWFyKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJPclJkIikgDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3RseSh0b3ApDQpgYGANCg0KYGBge3J9DQojIEFwcGx5IGdncGxvdGx5IHRvICdib3R0b20gZml2ZScgZmlsbXMgICANCmJvdHRvbSA8LSBidG1maXZlICU+JQ0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYmluYXJ5LCBmaWxsPWNsZWFuX3Rlc3QsIHRleHQgPSBwYXN0ZSgidGl0bGU6IiwgdGl0bGUpKSkgKw0KICBnZW9tX2JhcigpICsNCiAgZmFjZXRfZ3JpZCguIH4geWVhcikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSkpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iQnVHbiIpIA0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90bHkoYm90dG9tKQ0KYGBgDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg==